home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 4 / Apprentice-Release4.iso / Source Code / Libraries / C Internet Config / IC Component Debug ƒ / IC Component Source ƒ / 68k Version ƒ / IC Component.c < prev    next >
Encoding:
Text File  |  1995-12-06  |  18.5 KB  |  548 lines  |  [TEXT/SPM ]

  1. /*
  2.     ICComponent.c
  3.     
  4.     C version of the IC Component.
  5.     
  6.     One may wonder why I took the time to port the IC stuff to C.  The simple answer is that I wanted to be able
  7.     to extend IC to handle some Internet services that I am bringing online.  Since I don't have a pascal compiler
  8.     (and since I prefer C), I first had to port IC before I could begin extending it.
  9.     
  10.     The original comment for the pascal file follows...
  11.     
  12.     History:
  13.         11/06/95 - dhn - Began C port.
  14.         
  15. */
  16.  
  17. /* Original Comment:
  18.     (* File:         ICComponent.p
  19.      * Generated by: 1.0d4
  20.      * For:          IC 1.2
  21.      * On:           Monday, 25 September 1995, 19:28:12
  22.      * 
  23.      * This file is part of the Internet Configuration system and
  24.      * is placed in the public domain for the benefit of all.
  25.      *)
  26. */
  27.  
  28. #include <Components.h>
  29. #include <Types.h>
  30. #include <Files.h>
  31. #include <Memory.h>
  32. #include <Errors.h>
  33. #include <ToolUtils.h>
  34. #include <AppleTalk.h>
  35. #include <Aliases.h>
  36.  
  37. #if USESROUTINEDESCRIPTORS
  38. #include <stdlib.h>
  39. #endif
  40.  
  41. #include "IC Types.h"
  42. #include "IC Keys.h"
  43. #include "IC Link In Subs.h"
  44. #include "IC Resource API.h"
  45. #include "IC Component API.h"
  46. #include "IC Component Selectors.h"
  47.  
  48. #include "IC Component.h"
  49.  
  50. ICError GetStringFromResourceFile(GlobalsHandle globals,short id,StringPtr name){
  51.     ICError err;
  52.     short refnum;
  53.     StringHandle strh;
  54.     
  55.     err=(ICError)noErr;
  56.     name[0]=0;
  57.     
  58. #ifndef DEBUG_IC_COMPONENT
  59.     /*
  60.         When debugging the IC component, the res file is not registered with the Component
  61.         Manager.  However, we don't want this to disable our debugging.
  62.         
  63.         Simple solution: Add the resource to the project file and conditionally compile the open
  64.         and close resource file stuff.
  65.     */
  66.     refnum=OpenComponentResFile((Component)(*globals)->self);
  67.  
  68.     if (refnum<=0){
  69.         return resNotFound;
  70.     }
  71. #endif
  72.     
  73.     strh=GetString(id);
  74.     if (strh==(StringHandle)0){
  75.         err=resNotFound;
  76.     } else {
  77.         HLock((Handle)strh);
  78.         BlockMoveData((Ptr)*strh,(Ptr)name,(*strh)[0]+1);
  79.         HUnlock((Handle)strh);
  80.         
  81.         err=noErr;
  82.     }
  83.     
  84. #ifndef DEBUG_IC_COMPONENT
  85.     CloseComponentResFile(refnum);
  86. #endif
  87.     
  88.     return er=noErr){
  89.             HLock(prefh);
  90.             err=ICCGetPref((*globals)->current_target,key,attr,*prefh,&prefsize);
  91.             HUnlock(prefh);
  92.         }
  93.         
  94.         err2=ICCIReleaseInside(globals,force_info);
  95.         
  96.         if (err==noErr)
  97.             err=err2;
  98.     }
  99.     
  100.     if ((prefh!=(Handle)0)&&(err!=noErr)){
  101.         SetHandleSize(prefh,0);
  102.     }
  103.     
  104.     return err;
  105. }
  106.  
  107. pascal ICError ICCIGetPrefHandle(GlobalsHandle globals,StringPtr key,ICAttr* attr,Handle* prefh){
  108.     ICError err;
  109.     
  110.     *prefh=NewHandle(0);
  111.     if (*prefh==(Handle)0)
  112.         return MemError();
  113.     
  114.     err=ICCIFindPrefHandle(globals,key,attr,*prefh);
  115.     
  116.     if (err==icPrefNotFoundErr){
  117.         SetHandleSize(*prefh,0);
  118.         *attr=(ICAttr)0;
  119.         err=noErr;
  120.     }
  121.     
  122.     return err;
  123. }
  124.  
  125. pascal ICError ICCISetPrefHandle(GlobalsHandle globals,StringPtr key,ICAttr attr,Handle prefh){
  126.     SignedByte s;
  127.     ICError err=noErr;
  128.     
  129.     if (prefh!=(Handle)0){
  130.         if (*prefh==(Ptr)0)
  131.             err=paramErr;
  132.         if (err==noErr){
  133.             s=HGetState(prefh);
  134.             HLock(prefh);
  135.             err=ICCSetPref((*globals)->current_target,key,attr,*prefh,GetHandleSize(prefh));
  136.             HSetState(prefh,s);
  137.         }
  138.     } else {
  139.         err=ICCSetPref((*globals)->current_target,key,attr,(Ptr)0,0);
  140.     }
  141.     
  142.     return err;
  143. }
  144.  
  145. pascal ICError ICCIDefaultFileName(GlobalsHandle globals,StringPtr name){
  146.     ICError err;
  147.     short refnum;
  148.     StringHandle strh;
  149.     Str255 s;
  150.     
  151.     err=GetStringFromResourceFile(globals,kICdefault_file_name_ID,s);
  152.     
  153.     if (err!=noErr)
  154.         PasStrCopy(kICDefaultFileName,name);
  155.     else
  156.         PasStrCopy(s,name);
  157.     
  158.     return err;
  159. }
  160.  
  161. pascal ICError ICCILaunchURL(GlobalsHandle globals,StringPtr hint,Ptr data,long len,long* selStart,long* selEnd){
  162.     ICError err;
  163.     Handle urlh;
  164.     ICAppSpec helper;
  165.     Str255 scheme;
  166.     long junk_attr;
  167.     long size;
  168.     
  169.     urlh=NewHandle(0);
  170.     if (urlh==(Handle)0){
  171.         return MemError();
  172.     }
  173.     
  174.     err=ICCParseURL((*globals)->current_target,hint,data,len,selStart,selEnd,urlh);
  175.     
  176.     if (err==noErr){
  177.         err=FindScheme(urlh,scheme);
  178.     }
  179.     
  180.     if (err==noErr){
  181.         Str255 conscheme;
  182.         Ptr spos;
  183.         
  184.         PasStrCopy(kICHelper,conscheme);
  185.         spos=(Ptr)(&(conscheme[conscheme[0]+1]));
  186.         
  187.         BlockMoveData((Ptr)(&(scheme[1])),spos,scheme[0]);
  188.         conscheme[0]+=scheme[0];
  189.         
  190.         size=sizeof(helper);
  191.         err=ICCGetPref((*globals)->current_target,conscheme,&junk_attr,(Ptr)(&helper),&size);
  192.     }
  193.     
  194.     if (err==noErr){
  195.         err=LaunchURL(helper.fCreator,urlh);
  196.     }
  197.     
  198.     if (urlh!=(Handle)0){
  199.         DisposeHandle(urlh);
  200.     }
  201.     
  202.     return err;
  203. }
  204.  
  205. pascal ICError ICCIMapFilename(GlobalsHandle globals,StringPtr filename,ICMapEntry* entry){
  206.     ICError err;
  207.     Handle entries;
  208.     ICAttr junk_attr;
  209.     
  210.     err=(ICError)noErr;
  211.     
  212.     if (filename[0]==0)
  213.         return paramErr;
  214.     
  215.     err=ICCGetPrefHandle((*globals)->current_target,kICMapping,&junk_attr,&entries);
  216.     
  217.     if (err==noErr){
  218.         err=ICCMapEntriesFilename((*globals)->current_target,entries,filename,entry);
  219.         
  220.         DisposeHandle(entries);
  221.     }
  222.     
  223.     return err;
  224. }
  225.  
  226. pascal ICError ICCIMapTypeCreator(GlobalsHandle globals,OSType fType,OSType fCreator,StringPtr filename,
  227.         ICMapEntry* entry){
  228.     ICError err;
  229.     Handle entries;
  230.     ICAttr junk_attr;
  231.     
  232.     err=ICCGetPrefHandle((*globals)->current_target,kICMapping,&junk_attr,&entries);
  233.     
  234.     if (err==noErr){
  235.         err=ICCMapEntriesTypeCreator((*globals)->current_target,entries,fType,fCreator,filename,entry);
  236.         DisposeHandle(entries);
  237.     }
  238.     
  239.     return err;
  240. }
  241.  
  242. pascal ICError ICCIStop(GlobalsHandle globals){
  243.     return ICRStop(&((*globals)->inst));
  244. }
  245.  
  246. pascal ICError ICCIFindConfigFile(GlobalsHandle globals,short count,ICDirSpecArrayPtr folders){
  247.     return ICRFindConfigFile(&((*globals)->inst),count,folders);
  248. }
  249.  
  250. pascal ICError ICCIFindUserConfigFile(GlobalsHandle globals,ICDirSpec* where){
  251.     return ICRFindUserConfigFile(&((*globals)->inst),where);
  252. }
  253.  
  254. pascal ICError ICCIGeneralFindConfigFile(GlobalsHandle globals,Boolean search_prefs,Boolean can_create,short count,
  255.         ICDirSpecArrayPtr folders){
  256.     return ICRGeneralFindConfigFile(&((*globals)->inst),search_prefs,can_create,count,folders);
  257. }
  258.  
  259. pascal ICError ICCIChooseConfig(GlobalsHandle globals){
  260.     return ICRChooseConfig(&((*globals)->inst));
  261. }
  262.  
  263. pascal ICError ICCIChooseNewConfig(GlobalsHandle globals){
  264.     return ICRChooseNewConfig(&((*globals)->inst));
  265. }
  266.  
  267. pascal ICError ICCIGetGonfigName(GlobalsHandle globals,Boolean longname,StringPtr name){
  268.     return ICRGetConfigName(&((*globals)->inst),longname,name);
  269. }
  270.  
  271. pascal ICError ICCIGetConfigReference(GlobalsHandle globals,ICConfigRefHandle ref){
  272.     return ICRGetConfigReference(&((*globals)->inst),ref);
  273. }
  274.  
  275. pascal ICError ICCISetConfigReference(GlobalsHandle globals,ICConfigRefHandle ref,long flags){
  276.     return ICRSetConfigReference(&((*globals)->inst),ref,flags);
  277. }
  278.  
  279. pascal ICError ICCISpecifyConfigFile(GlobalsHandle globals,FSSpecPtr config){
  280.     return ICRSpecifyConfigFile(&((*globals)->inst),config);
  281. }
  282.  
  283. pascal ICError ICCIGetSeed(GlobalsHandle globals,long* seed){
  284.     return ICRGetSeed(&((*globals)->inst),seed);
  285. }
  286.  
  287. pascal ICError ICCIGetPerm(GlobalsHandle globals,ICPerm* perm){
  288.     return ICRGetPerm(&((*globals)->inst),perm);
  289. }
  290.  
  291. pascal ICError ICCIBegin(GlobalsHandle globals,ICPerm perm){
  292.     return ICRBegin(&((*globals)->inst),perm);
  293. }
  294.  
  295. pascal ICError ICCICountPref(GlobalsHandle globals,long* count){
  296.     return ICRCountPref(&((*globals)->inst),count);
  297. }
  298.  
  299. pascal ICError ICCIGetIndPref(GlobalsHandle globals,long n,StringPtr key){
  300.     return ICRGetIndPref(&((*globals)->inst),n,key);
  301. }
  302.  
  303. pascal ICError ICCIDeletePref(GlobalsHandle globals,StringPtr key){
  304.     return ICRDeletePref(&((*globals)->inst),key);
  305. }
  306.  
  307. pascal ICError ICCIEnd(GlobalsHandle globals){
  308.     return ICREnd(&((*globals)->inst));
  309. }
  310.  
  311. pascal ICError ICCIEditPreferences(GlobalsHandle globals,StringPtr key){
  312.     return ICREditPreferences(&((*globals)->inst),key);
  313. }
  314.  
  315. pascal ICError ICCIParseURL(GlobalsHandle globals,StringPtr hint,Ptr data,long len,long* selStart,long* selEnd,
  316.         Handle url){
  317.     return ICRParseURL(&((*globals)->inst),hint,data,len,selStart,selEnd,url);
  318. }
  319.  
  320. pascal ICError ICCIMapEntriesFilename(GlobalsHandle globals,Handle entries,StringPtr filename,ICMapEntry* entry){
  321.     return ICRMapEntriesFilename(&((*globals)->inst),entries,filename,entry);
  322. }
  323.  
  324. pascal ICError ICCIMapEntriesTypeCreator(GlobalsHandle globals,Handle entries,OSType fType,OSType fCreator,
  325.         StringPtr filename,ICMapEntry* entry){
  326.     return ICRMapEntriesTypeCreator(&((*globals)->inst),entries,fType,fCreator,filename,entry);
  327. }
  328.  
  329. pascal ICError ICCICountMapEntries(GlobalsHandle globals,Handle entries,long* count){
  330.     return ICRCountMapEntries(&((*globals)->inst),entries,count);
  331. }
  332.  
  333. pascal ICError ICCIGetIndMapEntry(GlobalsHandle globals,Handle entries,long ndx,long* pos,ICMapEntry* entry){
  334.     return ICRGetIndMapEntry(&((*globals)->inst),entries,ndx,pos,entry);
  335. }
  336.  
  337. pascal ICError ICCIGetMapEntry(GlobalsHandle globals,Handle entries,long pos,ICMapEntry* entry){
  338.     return ICRGetMapEntry(&((*globals)->inst),entries,pos,entry);
  339. }
  340.  
  341. pascal ICError ICCISetMapEntry(GlobalsHandle globals,Handle entries,long pos,ICMapEntry* entry){
  342.     return ICRSetMapEntry(&((*globals)->inst),entries,pos,entry);
  343. }
  344.  
  345. pascal ICError ICCIDeleteMapEntry(GlobalsHandle globals,Handle entries,long pos){
  346.     return ICRDeleteMapEntry(&((*globals)->inst),entries,pos);
  347. }
  348.  
  349. pascal ICError ICCIAddMapEntry(GlobalsHandle globals,Handle entries,ICMapEntry* entry){
  350.     return ICRAddMapEntry(&((*globals)->inst),entries,entry);
  351. }
  352.  
  353. // ----- Component Entry Point -----
  354.  
  355. /*
  356.     "Component entry point.  It's pretty neat IMHO." - IC Pascal Programmers
  357.     
  358.     They were correct, their component entry routine was pretty neat, but I couldn't 
  359.     duplicate it exactly.  The original routine used procptrs with jumps to the appropriate
  360.     routines.  I redid it to use universal proc ptrs with the conditional macros to expand the calls.
  361. */
  362. pascal ComponentResult 
  363. #ifdef DEBUG_IC_COMPONENT
  364. InternetConfig
  365. #else /* Not DEBUG_IC_COMPONENT */
  366. main
  367. #endif /* DEBUG_IC_COMPONENT */
  368. (ComponentParameters* params,Handle storage){
  369.     ComponentFunctionUPP proc;
  370.     SignedByte s;
  371.     ComponentResult cres;
  372.     
  373. #if USESROUTINEDESCRIPTORS
  374. #ifndef DEBUG_IC_COMPONENT
  375.     __rsrcinit();
  376. #else
  377.     DebugStr("\pIC Component");
  378.     
  379. #endif
  380. #endif
  381.     
  382.     proc=(ComponentFunctionUPP)0;
  383.     
  384.     switch (params->what){
  385.         // Component Manager Interface
  386.         
  387.         case kComponentVersionSelect:
  388.             cres=internetConfigurationComponentInterfaceVersion;
  389.             break;
  390.         case kComponentCanDoSelect:
  391.             proc=BuildNewProc(ICCICanDo,uppICCanDoProcInfo);
  392.             break;
  393.         case kComponentOpenSelect:
  394.             proc=BuildNewProc(ICCIOpen,uppICOpenProcInfo);
  395.             break;
  396.         case kComponentCloseSelect:
  397.             proc=BuildNewProc(ICCIClose,uppICCloseProcInfo);
  398.             break;
  399.         case kComponentTargetSelect:
  400.             proc=BuildNewProc(ICCITarget,uppICTargetProcInfo);
  401.             break;
  402.         
  403.         // Component Interface
  404.         
  405.         case kICCStart:
  406.             proc=BuildNewProc(ICCIStart,uppICStartProcInfo);
  407.             break;
  408.         case kICCStop:
  409.             proc=BuildNewProc(ICCIStop,uppICStopProcInfo);
  410.             break;
  411.         case kICCFindConfigFile:
  412.             proc=BuildNewProc(ICCIFindConfigFile,uppICFindConfigFileProcInfo);
  413.             break;
  414.         case kICCFindUserConfigFile:
  415.             proc=BuildNewProc(ICCIFindUserConfigFile,uppICFindUserConfigFileProcInfo);
  416.             break;
  417.         case kICCGeneralFindConfigFile:
  418.             proc=BuildNewProc(ICCIGeneralFindConfigFile,uppICGeneralFindConfigFileProcInfo);
  419.             break;
  420.         case kICCGetConfigName:
  421.             proc=BuildNewProc(ICCIGetGonfigName,uppICGetConfigNameProcInfo);
  422.             break;
  423.         case kICCGetConfigReference:
  424.             proc=BuildNewProc(ICCIGetConfigReference,uppICGetConfigReferenceProcInfo);
  425.             break;
  426.         case kICCChooseConfig:
  427.             proc=BuildNewProc(ICCIChooseConfig,uppICChooseConfigProcInfo);
  428.             break;
  429.         case kICCChooseNewConfig:
  430.             proc=BuildNewProc(ICCIChooseNewConfig,uppICChooseNewConfigProcInfo);
  431.             break;
  432.         case kICCSetConfigReference:
  433.             proc=BuildNewProc(ICCISetConfigReference,uppICSetConfigReferenceProcInfo);
  434.             break;
  435.         case kICCSpecifyConfigFile:
  436.             proc=BuildNewProc(ICCISpecifyConfigFile,uppICSpecifyConfigFileProcInfo);
  437.             break;
  438.         case kICCGetSeed:
  439.             proc=BuildNewProc(ICCIGetSeed,uppICGetSeedProcInfo);
  440.             break;
  441.         case kICCGetPerm:
  442.             proc=BuildNewProc(ICCIGetPerm,uppICGetPermProcInfo);
  443.             break;
  444.         case kICCDefaultFileName:
  445.             proc=BuildNewProc(ICCIDefaultFileName,uppICDefaultFileNameProcInfo);
  446.             break;
  447.         case kICCBegin:
  448.             proc=BuildNewProc(ICCIBegin,uppICBeginProcInfo);
  449.             break;
  450.         case kICCGetPref:
  451.             proc=BuildNewProc(ICCIGetPref,uppICGetPrefProcInfo);
  452.             break;
  453.         case kICCSetPref:
  454.             proc=BuildNewProc(ICCISetPref,uppICSetPrefProcInfo);
  455.             break;
  456.         case kICCFindPrefHandle:
  457.             proc=BuildNewProc(ICCIFindPrefHandle,uppICFindPrefHandleProcInfo);
  458.             break;
  459.         case kICCGetPrefHandle:
  460.             proc=BuildNewProc(ICCIGetPrefHandle,uppICGetPrefHandleProcInfo);
  461.             break;
  462.         case kICCSetPrefHandle:
  463.             proc=BuildNewProc(ICCISetPrefHandle,uppICSetPrefHandleProcInfo);
  464.             break;
  465.         case kICCCountPref:
  466.             proc=BuildNewProc(ICCICountPref,uppICCountPrefProcInfo);
  467.             break;
  468.         case kICCGetIndPref:
  469.             proc=BuildNewProc(ICCIGetIndPref,uppICGetIndPrefProcInfo);
  470.             break;
  471.         case kICCDeletePref:
  472.             proc=BuildNewProc(ICCIDeletePref,uppICDeletePrefProcInfo);
  473.             break;
  474.         case kICCEnd:
  475.             proc=BuildNewProc(ICCIEnd,uppICEndProcInfo);
  476.             break;
  477.         case kICCEditPreferences:
  478.             proc=BuildNewProc(ICCIEditPreferences,uppICEditPreferencesProcInfo);
  479.             break;
  480.         case kICCParseURL:
  481.             proc=BuildNewProc(ICCIParseURL,uppICParseURLProcInfo);
  482.             break;
  483.         case kICCLaunchURL:
  484.             proc=BuildNewProc(ICCILaunchURL,uppICLaunchURLProcInfo);
  485.             break;
  486.         case kICCMapFilename:
  487.             proc=BuildNewProc(ICCIMapFilename,uppICMapFilenameProcInfo);
  488.             break;
  489.         case kICCMapTypeCreator:
  490.             proc=BuildNewProc(ICCIMapTypeCreator,uppICMapTypeCreatorProcInfo);
  491.             break;
  492.         case kICCMapEntriesFilename:
  493.             proc=BuildNewProc(ICCIMapEntriesFilename,uppICMapEntriesFilenameProcInfo);
  494.             break;
  495.         case kICCMapEntriesTypeCreator:
  496.             proc=BuildNewProc(ICCIMapEntriesTypeCreator,uppICMapEntriesTypeCreatorProcInfo);
  497.             break;
  498.         case kICCCountMapEntries:
  499.             proc=BuildNewProc(ICCICountMapEntries,uppICCountMapEntriesProcInfo);
  500.             break;
  501.         case kICCGetIndMapEntry:
  502.             proc=BuildNewProc(ICCIGetIndMapEntry,uppICGetIndMapEntryProcInfo);
  503.             break;
  504.         case kICCGetMapEntry:
  505.             proc=BuildNewProc(ICCIGetMapEntry,uppICGetMapEntryProcInfo);
  506.             break;
  507.         case kICCSetMapEntry:
  508.             proc=BuildNewProc(ICCISetMapEntry,uppICSetMapEntryProcInfo);
  509.             break;
  510.         case kICCDeleteMapEntry:
  511.             proc=BuildNewProc(ICCIDeleteMapEntry,uppICDeleteMapEntryProcInfo);
  512.             break;
  513.         case kICCAddMapEntry:
  514.             proc=BuildNewProc(ICCIAddMapEntry,uppICAddMapEntryProcInfo);
  515.             break;
  516.             
  517.         default:
  518.             cres=(ComponentResult)badComponentSelector;
  519.             break;
  520.     }
  521.     
  522.     if (proc!=(ComponentFunctionUPP)0){
  523.         // have a proc, call it
  524.         
  525.         if (storage!=(Handle)0){
  526.             s=HGetState(storage);
  527.             HLock(storage);
  528.         }
  529.         
  530.         cres=CallComponentFunctionWithStorage(storage,params,proc);
  531.         
  532.         DisposeRoutineDescriptor((UniversalProcPtr)proc);
  533.         
  534.         if ((storage!=(Handle)0)&&(params->what!=kComponentCloseSelect)){
  535.             HSetState(storage,s);
  536.         }
  537.         
  538.     }
  539.     
  540. #if USESROUTINEDESCRIPTORS
  541. #ifndef DEBUG_IC_COMPONENT
  542.     __rsrcterm();
  543. #endif
  544. #endif
  545.  
  546.     return cres;
  547. }
  548.